package com.fm.base.json;

import java.util.List;

public interface JsonArray extends JsonStructure, javax.json.JsonArray {
    @Override
    default JsonObject getJsonObject(int index) {
        return (JsonObject) get(index);
    }

    @Override
    default JsonArray getJsonArray(int index) {
        return (JsonArray) get(index);
    }

    @Override
    default JsonNumber getJsonNumber(int index) {
        return (JsonNumber) get(index);
    }

    @Override
    default JsonString getJsonString(int index) {
        return (JsonString) get(index);
    }

    default JsonBoolean getJsonBoolean(int index) {
        return (JsonBoolean) get(index);
    }

    @Override
    @SuppressWarnings("unchecked")
    default <T extends javax.json.JsonValue> List<T> getValuesAs(Class<T> clazz) {
        return (List<T>) this;
    }

    @Override
    default String getString(int index) {
        JsonString val = (JsonString) get(index);
        return val == null ? null : val.getString();
    }

    @Override
    default String getString(int index, String defaultValue) {
        JsonString val = (JsonString) get(index);
        return val == null ? defaultValue : val.getString();
    }

    @Override
    default int getInt(int index) {
        return getJsonNumber(index).intValue();
    }

    @Override
    default int getInt(int index, int defaultValue) {
        JsonNumber val = (JsonNumber) get(index);
        return val == null ? defaultValue : val.intValue();
    }

    @Override
    default boolean getBoolean(int index) {
        return getJsonBoolean(index).getBoolean();
    }

    @Override
    default boolean getBoolean(int index, boolean defaultValue) {
        JsonBoolean val = (JsonBoolean) get(index);
        return val == null ? defaultValue : val.getBoolean();
    }

    @Override
    default boolean isNull(int index) {
        return get(index) == null;
    }

    boolean add(String string);

    boolean add(Number number);

    boolean add(boolean b);

    default JsonArray append(JsonValue val) {
        add(val);
        return this;
    }
}
